package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ITransferAccountsDetailDAO;
import org.jsola.hr.dto.TransferAccountsDetailAddDTO;
import org.jsola.hr.dto.TransferAccountsDetailUpdateDTO;
import org.jsola.hr.entity.TransferAccountsDetailDO;
import org.jsola.hr.query.TransferAccountsDetailQuery;
import org.jsola.hr.query.TransferBuildDetailQuery;
import org.jsola.hr.vo.TransferAccountsDetailImportAllVO;
import org.jsola.hr.vo.TransferAccountsDetailListVO;
import org.jsola.hr.vo.TransferAccountsDetailVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;


/**
 * 转账明细
 *
 * @author zhr
 */
public interface ITransferAccountsDetailService extends IService<ITransferAccountsDetailDAO, TransferAccountsDetailDO> {

    /**
     * 新增转账明细
     * @param transferAccountsDetailAddDTO 新增转账明细DTO
     * @param tokenUser 当前用户
     * @return 转账明细详情信息
     */
    TransferAccountsDetailVO save(TransferAccountsDetailAddDTO transferAccountsDetailAddDTO, TokenUser tokenUser);

    /**
     * 批量新增转账明细
     * @param transferAccountsDetailAddDTOList 新增转账明细List
     * @param tokenUser 当前用户
     * @return 保存条数
     */
    int saveBatch(List<TransferAccountsDetailAddDTO> transferAccountsDetailAddDTOList, TokenUser tokenUser);

    /**
     * 修改转账明细
     * @param transferAccountsDetailUpdateDTO 修改转账明细DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(TransferAccountsDetailUpdateDTO transferAccountsDetailUpdateDTO, TokenUser tokenUser);

    /**
     * 批量修改转账明细
     * @param transferAccountsDetailUpdateDTO 修改转账明细DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int updateBatch(TransferAccountsDetailUpdateDTO transferAccountsDetailUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除转账明细，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param transferAccountsDetailIds 转账明细id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...transferAccountsDetailIds);

    /**
     * 根据转账明细id查找
     * @param transferAccountsDetailId 转账明细id
     * @param siteId 所属站点id
     * @return 转账明细详情信息
     */
    TransferAccountsDetailVO selectById(String transferAccountsDetailId, String siteId);

    /**
     * 查询转账明细
     * @param transferAccountsDetailQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账明细列表信息
     */
    List<TransferAccountsDetailListVO> select(TransferAccountsDetailQuery transferAccountsDetailQuery, String siteId);

    /**
    * 查询转账明细记录数
    * @param transferAccountsDetailQuery 查询条件
    * @param siteId 所属站点id
    * @return 转账明细记录数
    */
    int selectCount(TransferAccountsDetailQuery transferAccountsDetailQuery, String siteId);

    /**
     * 分页查询转账明细
     * @param transferAccountsDetailQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账明细列表信息
     */
    Page<TransferAccountsDetailListVO> selectPage(TransferAccountsDetailQuery transferAccountsDetailQuery, String siteId);


    /**
     * 根据转账明细id查找
     * @param transferAccountsDetailId 转账明细id
     * @param siteId 所属站点id
     * @return 转账明细
     */
    TransferAccountsDetailDO selectDOById(String transferAccountsDetailId, String siteId);

    /**
     * 查询转账明细
     * @param transferAccountsDetailQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账明细列表
     */
    List<TransferAccountsDetailDO> selectDO(TransferAccountsDetailQuery transferAccountsDetailQuery, String siteId);

    /**
     * 根据批次id查询批次明细信息
     * @param batchId 批次id
     * @param siteId 租户id
     * @return 批次明细信息
     */
    List<TransferAccountsDetailDO> selectByBatchId(String batchId, String siteId);

    /**
     * 根据查询条件  查询明细信息的idList
     * @param transferAccountsDetailQuery 查询条件
     * @param siteId 所属站点id
     * @return 转账明细id
     */
    List<String> selectIdsByBatchId(TransferAccountsDetailQuery transferAccountsDetailQuery, String siteId);

    /**
     * 根据批次id查询批次明细信息
     * @param batchId 批次id
     * @param idCard 身份证号
     * @param siteId 租户id
     * @return 批次明细信息
     */
    TransferAccountsDetailDO selectByBatchIdAndIdCard(String batchId, String idCard, String siteId);


    /**
     * 根据参数  新增计薪人员
     * @param transferBuildDetailQuery 构造批次明细新增的
     * @param tokenUser 当前用户
     * @return 批次明细Lst
     */
    TransferAccountsDetailImportAllVO buildDetailAddDTOList(TransferBuildDetailQuery transferBuildDetailQuery,
                                                             TokenUser tokenUser);

    /**
     * 查询转账批次明细数据，用于导出
     *
     * @param transferAccountsDetailQuery 导出查询参数
     * @param tokenUser                   当前用户
     * @return excel地址
     */
    String selectExportList(TransferAccountsDetailQuery transferAccountsDetailQuery, TokenUser tokenUser);

    /**
     * 识别批次明细信息
     * @param file 待识别的文件
     * @param batchId 批次id（可以为空）
     * @param companyId 公司id
     * @param type 到账方式 1：支付宝 2：微信 3：银行
     * @param tokenUser 当前用户
     * @return 导入的全部转账明细(错误正确的都在里面)
     */
    TransferAccountsDetailImportAllVO recognitionDetailInfo(File file, String batchId, String companyId,
                                                            Integer type, TokenUser tokenUser);
    /**
     * 导出识别的错误信息
     *
     * @param failTransferAccountsDetailAddDTOList 导出的数据List
     * @param type 到账方式 1：支付宝 2：微信 3：银行
     * @return excel地址
     */
    String exportFailTransferAccountsDetail(List<TransferAccountsDetailAddDTO> failTransferAccountsDetailAddDTOList,
                                            Integer type);

    /**
     * 导出识别的错误信息(返回不需要登录的上传到服务器的文件下载地址)
     *
     * @param failTransferAccountsDetailAddDTOList 导出的数据List
     * @param type 到账方式 1：支付宝 2：微信 3：银行
     * @return 地址
     */
    String uploadFileNotLoginFailList(List<TransferAccountsDetailAddDTO> failTransferAccountsDetailAddDTOList,
                                      Integer type);

    /**
     * 根据第三方批次明细id查询批次明细信息（查询一个，多个直接报错）
     * @param thirdPartyId 第三方批次明细的id
     * @param siteId 租户id
     * @return hr批次明细信息
     */
    TransferAccountsDetailDO selectByThirdPartyId(String thirdPartyId, String siteId);

    /**
     * 根据业务状态及转账人员库id查询批次明细信息
     * @param peopleId 转账人员库id
     * @param subjectStatus 业务状态
     * @param siteId 租户id
     * @return 批次明细列表
     */
    List<TransferAccountsDetailDO> selectByPeopleIdAndSubjectStatus(String peopleId, Integer subjectStatus, String siteId);

    /**
     * 分页查询转账明细(根据转账人员库id查询明细信息：不查询未支付的)
     * @param transferAccountsDetailQuery 转账人员库id
     * @param siteId 所属站点id
     * @return 转账明细列表信息
     */
    Page<TransferAccountsDetailListVO> selectPageByPeopleId(TransferAccountsDetailQuery transferAccountsDetailQuery, String siteId);

    /**
     * 查询转账批次明细数据，导出未处理的异常信息
     *
     * @param transferAccountsDetailQuery 导出查询参数
     * @param tokenUser                   当前用户
     * @return excel地址
     */
    String selectExportErrorList(TransferAccountsDetailQuery transferAccountsDetailQuery, TokenUser tokenUser);

    /**
     * 根据批次id删除批次明细信息
     * @param batchId 批次id
     * @param tokenUser 当前用户
     * @return 删除的批次明细个数
     */
    int deleteByBatchId(String batchId, TokenUser tokenUser);

    /**
     * 批量修改转账明细（修改处理已处理专用）
     * @param transferAccountsDetailUpdateDTO 修改转账明细DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int updateBatchAndBatchInfo(TransferAccountsDetailUpdateDTO transferAccountsDetailUpdateDTO, TokenUser tokenUser);

}


